import store from '@/store'
import axios from 'axios'
import JSONBig from 'json-bigint'
import router from '../router/auth'

const URL = process.env.NODE_ENV === 'production' // 判断是否为开发环境
  ? 'http://api-toutiao-web.itheima.net'// 后端服务器2
  : 'http://ttapi.research.itcast.cn'// 后端服务器1
  // http://toutiao-app.itheima.net  去掉接口的app

const instance = axios.create({
  baseURL: URL,
  timeout: 6000, // 超时
  transformResponse: [data => { // 响应头转换器
    try {
      return JSONBig.parse(data)
    } catch (err) {
      return data
    }
  }]
})

const changeUrl = config => { // 临时环境
  config.baseURL = 'http://toutiao-app.itheima.net'
  config.url = config.url.replace('/app', '')
  return config
}

instance.interceptors.request.use( // 请求头拦截器
  config => {
    const TOKEN_STR = store.state.tokenInfo.token
    TOKEN_STR && (config.headers.Authorization = `Bearer ${TOKEN_STR}`)// 设置请求头携带token
    changeUrl(config)
    return config
  }, err => {
    return Promise.reject(err)
  })

instance.interceptors.response.use(res => { // 响应头
  /* 错误处理 */
  // ......
  return res
}, async err => {
  // 开始处理
  if (err.response.status === 401) {
    const refreshToken = store.state.tokenInfo.refresh_token
    if (refreshToken) {
      try {
        const res = await axios({
          method: 'PUT',
          url: 'http://ttapi.research.itcast.cn/app/v1_0/authorizations',
          headers: {
            Authorization: `Bearer ${refreshToken}`
          }
        })
        const newToken = res.data.data.token
        // 把新token保存到vuex
        console.log('把新token保存到vuex')
        store.commit('mSetTokenInfo', {
          token: newToken, // 变化了
          refresh_token: refreshToken // 没有变化
        })
        // instance重发请求，它会自动去vuex中带上最新的token(没过期的，新的)
        return instance(err.config)
      } catch (err) {
        // 1. 清空token
        store.commit('mSetTokenInfo', {})
        // 2. 回去登陆
        router.push('/login?backto=' + router.currentRoute.fullPath)
        // 3. 返回错误信息
        return Promise.reject(new Error('请求新token失败'))
      }
    } else {
      // 1. 清空token
      store.commit('mSetTokenInfo', {})
      // 2. 回去登陆, 带上要返回的地址
      console.log(router.currentRoute.fullPath)
      router.push('/login?backto=' + router.currentRoute.fullPath)
      // 3. 返回错误信息
      return Promise.reject(new Error('refresh_token不存在'))
    }
  }
  return Promise.reject(err)
})

export default instance
